package karaokestrong.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import karaokestrong.excepcion.DAOExcepcion;
import karaokestrong.modelo.Administrador;
import karaokestrong.modelo.Local;
import karaokestrong.modelo.Evento;
import karaokestrong.modelo.Reserva;
import karaokestrong.util.ConexionBD;

public class EventoDAO extends BaseDAO{
	
public Evento insertar(Evento vo) throws DAOExcepcion {
		
		System.out.println("EventoDAO: insertar(Evento vo)");
		String query = "INSERT INTO Evento(nombre,fecha,capacidad,descripcion,elog,idlocal) VALUES (?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		try {
			con = ConexionBD.obtenerConexion();
			System.out.println("000000000");
			stmt = con.prepareStatement(query);
			System.out.println("1111111");
			
			
			System.out.println("Nombre: "+vo.getNombre());
			stmt.setString(1, vo.getNombre());
			stmt.setTimestamp(2, vo.getFecha());
			stmt.setInt(3, vo.getCapacidad());
			stmt.setString(4, vo.getDescripcion());
			stmt.setBoolean(5, vo.isElog());	
			stmt.setInt(6, vo.getIdlocal());
			System.out.println("Se Gravo correctamente el registro");
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			
			// Obtener el ultimo Id de Evento (Autoincrementativo)
			int id = 0;
			query = "SELECT LAST_INSERT_ID()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			vo.setIdevento(id);
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

public Collection<Evento> listarEventos() throws DAOExcepcion {
	String query = "select * from evento";


	Collection<Evento> c = new ArrayList<Evento>();
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		rs = stmt.executeQuery();
		while (rs.next()) {
			Evento vo = new Evento();
			
			vo.setIdevento(rs.getInt("idevento"));
			vo.setNombre(rs.getString("nombre"));
			vo.setFecha(rs.getTimestamp("fecha"));
			vo.setCapacidad(rs.getInt("capacidad"));
			vo.setDescripcion(rs.getString("descripcion"));
			vo.setElog(rs.getBoolean("elog"));
			vo.setIdlocal(rs.getInt("idlocal"));
			c.add(vo);
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return c;
}


public Evento eliminar(Evento vo) throws DAOExcepcion {
	String query = "update evento set elog = true where idevento=?";
	Connection con = null;
	PreparedStatement stmt = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		//stmt.setBoolean(1, vo.isElog());
		stmt.setInt(1, vo.getIdevento());
		int i = stmt.executeUpdate();
		if (i != 1) {
			throw new SQLException("No se pudo anular Evento");
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return vo;
}

public Evento actualizar(Evento vo) throws DAOExcepcion {
	String query = "update Evento set nombre=?, fecha=?, capacidad=?, descripcion=?, elog=?, idlocal=? where idevento=?";
	Connection con = null;
	PreparedStatement stmt = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		
		stmt.setString(1, vo.getNombre());
		stmt.setTimestamp(2, vo.getFecha());
		stmt.setInt(3, vo.getCapacidad());
		stmt.setString(4, vo.getDescripcion());
		stmt.setBoolean(5,vo.isElog());
		stmt.setInt(6, vo.getIdlocal());
		stmt.setInt(7, vo.getIdevento());
		
		int i = stmt.executeUpdate();
		if (i != 1) {
			throw new SQLException("No se pudo actualizar");
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return vo;
}

/*public Evento actualizar(Evento vo) throws DAOExcepcion {
	String query = "update evento set nombre=?,fecha=?,capacidad=?,descripcion=?,elog=?,idlocal=? where idevento=?";
	Connection con = null;
	PreparedStatement stmt = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		stmt.setInt(1, vo.getIdevento());
		stmt.setString(2, vo.getNombre());
		stmt.setTimestamp(3, vo.getFecha());
		stmt.setInt(4, vo.getCapacidad());
		stmt.setString(5, vo.getDescripcion());
		stmt.setBoolean(6,vo.isElog());
		stmt.setInt(7, vo.getIdlocal());
		
		int i = stmt.executeUpdate();
		if (i != 1) {
			throw new SQLException("No se pudo actualizar el Evento");
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return vo;
}
*/
public Collection<Evento> buscarPorNombre(String nombre) throws DAOExcepcion {
	String query = "select idevento, nombre,fecha,capacidad, descripcion,elog,idlocal from evento where nombre like ?";
	Collection<Evento> lista = new ArrayList<Evento>();
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		stmt.setString(1, "%" + nombre + "%");
		rs = stmt.executeQuery();
		while (rs.next()) {
			Evento vo = new Evento();
			
			vo.setIdevento(rs.getInt("idevento"));
			vo.setNombre(rs.getString("nombre"));
			vo.setFecha(rs.getTimestamp("fecha"));
			vo.setCapacidad(rs.getInt("capacidad"));
			vo.setDescripcion(rs.getString("descripcion"));
			vo.setElog(rs.getBoolean("elog"));
			vo.setIdlocal(rs.getInt("idlocal"));
						
			lista.add(vo);
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	System.out.println(lista.size());
	return lista;
}




}
	
